package com.ruoyi.project.system.mapper;

import com.ruoyi.project.system.domain.SysUser;
import com.ruoyi.project.system.domain.vo.Member;
import org.apache.ibatis.annotations.MapKey;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;

import java.util.List;
import java.util.Map;

/**
 * 用户表 数据层
 */
public interface SysUserMapper {

    @Select("SELECT (SELECT COUNT(*) FROM sys_user WHERE role_id=2) R2, (SELECT COUNT(*) FROM sys_user WHERE role_id=3) R3, (SELECT COUNT(*) FROM sys_user WHERE role_id=4) R4,(SELECT COUNT(*) FROM sys_user WHERE role_id=5) R5,(SELECT COUNT(*) FROM sys_user WHERE role_id=6) R6")
    Map<String, Long> statisticUser();

    Map<String, Double> statisticQueryAndPayAndIncome();

    Map<String, String> selectRoleInfoByUserId(Long userId);

    List<Member> queryMember(Long userId);

    int insertInviteCode(Long userId, String type, String info, String inviteCode);

    @Select("SELECT inviteCode FROM sm_invite_code WHERE userId = #{userId} and `type` = #{type} and info = #{info}")
    String getInviteCode(Long userId, String type, String info);

    @Select("SELECT userId, info AS role FROM sm_invite_code WHERE `type` = #{type} and inviteCode = #{inviteCode}")
    Map<String, Object> queryInviteUserIdAndRole(String type, String inviteCode);

    @Update("UPDATE sm_invite_code SET inviteCode = #{newInviteCode},updateTime = now() WHERE inviteCode = #{oldInviteCode}")
    Integer updateInviteCode(String newInviteCode, String oldInviteCode);

    String queryRegisterAreaCode(String type, String inviteCode);

    Map<String, String> selectAliAccount(Long userId);

    List<Map<String, String>> distinctNickName(Long userId);

    Integer teamNumberOfPeople(Long userId);

    Integer teamNumberOfQuery(Long userId);

    Float teamNumberOfIncome(Long userId);

    String queryRegisterAreaName(Long userId);

    List<String> queryRegionCaptainAreaName(Long userId);

    Integer queryCaptainCount(Long userId);

    Integer queryMemberCount(Long userId);

    Integer queryRoleId(Long userId);

    Long queryParentId(Long userId);

    /**
     * 根据条件分页查询用户列表
     *
     * @param sysUser 用户信息
     * @return 用户信息集合信息
     */
    List<SysUser> selectUserList(SysUser sysUser);

    List<SysUser> selectUserList_(SysUser sysUser);

    /**
     * 根据条件分页查询已配用户角色列表
     *
     * @param user 用户信息
     * @return 用户信息集合信息
     */
    List<SysUser> selectAllocatedList(SysUser user);

    /**
     * 根据条件分页查询未分配用户角色列表
     *
     * @param user 用户信息
     * @return 用户信息集合信息
     */
    List<SysUser> selectUnallocatedList(SysUser user);

    /**
     * 通过用户名查询用户
     *
     * @param userName 用户名
     * @return 用户对象信息
     */
    SysUser selectUserByUserName(String userName);

    /**
     * 通过用户ID查询用户
     *
     * @param userId 用户ID
     * @return 用户对象信息
     */
    SysUser selectUserById(Long userId);

    /**
     * 新增用户信息
     *
     * @param user 用户信息
     * @return 结果
     */
    int insertUser(SysUser user);

    int upgradeUser(Long userId, Integer roleId, Long parentId);

    /**
     * 修改用户信息
     *
     * @param user 用户信息
     * @return 结果
     */
    int updateUser(SysUser user);

    /**
     * 重置用户密码
     *
     * @param userName 用户名
     * @param password 密码
     * @return 结果
     */
    int resetUserPwd(@Param("userName") String userName, @Param("password") String password);

    /**
     * 通过用户ID删除用户
     *
     * @param userId 用户ID
     * @return 结果
     */
    int deleteUserById(Long userId);

    /**
     * 批量删除用户信息
     *
     * @param userIds 需要删除的用户ID
     * @return 结果
     */
    int deleteUserByIds(Long[] userIds);

    /**
     * 校验用户名称是否唯一
     *
     * @param userName 用户名称
     * @return 结果
     */
    SysUser checkUserNameUnique(String userName);


    /**
     * 校验email是否唯一
     *
     * @param email 用户邮箱
     * @return 结果
     */
    SysUser checkEmailUnique(String email);
}
